package com.augurit.common.dao;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Repository;

import com.augurit.common.base.dao.BaseDao;
import com.augurit.common.constant.OrgConstant;
import com.augurit.common.entity.AcUserFunc;
import com.augurit.common.system.convert.AcFunctionConverter;
import com.augurit.common.system.web.org.form.AcUserFuncForm;
import com.augurit.common.util.lang.CollectionUtils;

/**
 * 用户特殊权限配置DAO类
 */
@Repository
public class AcUserFuncDao extends BaseDao<AcUserFunc, Long> {

	/**
	 * 保存用户特殊权限配置Form对象
	 * @param form 用户特殊权限配置Form对象
	 */
	public void save(AcUserFuncForm form){
		
		if(form != null){
			AcUserFunc entity = null;
			
			//准备VO对象
			if(form != null && form.getUfId() != null){
				entity = this.get(form.getUfId());
			}else{
				entity = new AcUserFunc();
			}
			
			//属性值转换
			AcFunctionConverter.convertToEntity(form, entity);
			
			//保存
			super.save(entity);
			
			//回填ID属性值
			form.setUfId(entity.getUfId());
		}
	}

	/**
	 * 根据功能ID找出主键ID集合
	 * @param funcId 功能ID
	 * @return
	 */
    public List<Long> getIdsByFuncId(Long funcId){
    	if(funcId != null)
	    	return partSelectByFuncId(funcId, "ufId");
    	else
    		return null;
    }
    
    /**
     * 
	 * 根据功能ID找出拥有该功能的用户ID集合
	 * @param funcId 功能ID
	 * @return
	 */
    public List<Long> getUserIdsByFuncId(Long funcId){
    	if(funcId != null)
	    	return partSelectByFuncId(funcId, "userId");
    	else
    		return null;
    }
       
    /**
	 * 根据功能ID找出Entity对象列表
	 * @param funcId 功能ID
	 * @return
	 */
    public List<AcUserFunc> getByFuncId(Long funcId){
    	if(funcId != null)
	    	return partSelectByFuncId(funcId, null);
    	else
    		return null;
    }

    /**
     * 返回要查询的结果
     * @param funcId
     * @param entityProperty
     * @return
     */
    private List partSelectByFuncId(Long funcId, String entityProperty){
		String hql = "select " 
						+ (entityProperty != null && entityProperty.trim().length() > 0 ? "ps." + entityProperty : "ps") 
						+ " from AcUserFunc ps where ps.funcId = ?";
		List values = new ArrayList();
		values.add(funcId);
		
		return this.find(hql,values);
	}
    
    /**
	 * 删除关联功能ID的对象列表
	 * @param funcId 功能ID
	 * @return
	 */
    public void deleteByFuncId(Long funcId){
    	List<Long> list = getIdsByFuncId(funcId);
    	if(list != null && list.size() > 0)
    		this.delete(CollectionUtils.toLongArray(list));
    }
    
    
	/**
	 * 获取用户特别开通的功能
	 * @param userId
	 */
    public Long[] getPermittedFuncIdsByUserId(Long userId){
    	if(userId != null){
    		return getSpecialFuncs(userId, OrgConstant.ONE);
    	}
    	return null;
    }
    
	/**
	 * 获取用户特别禁止的功能
	 * @param userId
	 */
    public Long[] getForbidenFuncIdsByUserId(Long userId){
    	if(userId != null){
    		return getSpecialFuncs(userId, OrgConstant.ZERO);
    	}
    	return null;
    }
    
    /**
     * 获取拥有某项特别开通的功能的用户id集合
     * @param funcId 功能id
     * @return 用户id数组
     */
    public Long[] getUserIdsBySpcialOpenFuncId(Long funcId){
    	if( funcId != null)
    		return getUserIdOwedSpecialFunc(funcId, OrgConstant.ONE);
    	return null;
    }
    
    /**
     * 获取拥有某项特别开通的功能的用户id集合
     * @param funcId 功能id
     * @return 用户id数组
     */
    public Long[] getUserIdsBySpcialFibidenFuncId(Long funcId){
    	if( funcId != null)
    		return getUserIdOwedSpecialFunc(funcId, OrgConstant.ZERO);
    	return null;
    }
    
    /**
     * 获取特别开通或特别禁止的功能
     * @param userId 用户id
     * @param authType 开通或禁止的类型，1表示开通，0表示禁止
     * @return 功能id数组
     */
    private Long[] getSpecialFuncs(Long userId, String authType){
    	if(userId != null && authType.trim().length() > 0){
    		String hql = "select ps.funcId from AcUserFunc ps where userId=? and authType=?";
    		List values = new ArrayList();
    		values.add(userId);
    		values.add(authType);
    		List<Long> funcIdList = this.find(hql, values);
    		return CollectionUtils.toLongArray(funcIdList);
    	}
    	return null;
    }
    
    /**
     * 获取拥有某项特别开通或特别禁止的功能的用户id
     * @param userId 用户id
     * @param authType 开通或禁止的类型
     * @return 用户id数组
     */
    private Long[] getUserIdOwedSpecialFunc(Long funcId, String authType){
    	if(funcId != null && authType.trim().length() > 0){
    		String hql = " select ps.userId from AcUserFunc ps where funcId = ? and authType= ?";
    		List values = new ArrayList();
    		values.add(funcId);
    		values.add(authType);
    		List<Long> userList = this.find(hql,values);
    		return (CollectionUtils.toLongArray(userList));
    	}
    	return null;
    }
    
}
